#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <unistd.h>
#include <signal.h>

volatile sig_atomic_t sigflag;
sigset_t newmask, oldmask, zeromask;

void sig_usr(int signo) {
	sigflag = 1;
}

void TELL_WAIT() {
	if (signal(SIGUSR1, sig_usr) == SIG_ERR) {
		
	}

	if (signal(SIGUSR2, sig_usr) == SIG_ERR) {
		
	}

	sigemptyset(&zeromask);
	sigemptyset(&newmask);
	sigaddset(&newmask, SIGUSR1);
	sigaddset(&newmask, SIGUSR2);

	if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) {
		
	}
}

void TELL_PARENT(pid_t pid) {
	kill(pid, SIGUSR2);
}

void WAIT_PARENT() {
	while (sigflag == 0) 
		sigsuspend(&zeromask);
	sigflag = 0;

	if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) {

	}
}

void TELL_CHILD(pid_t pid) {
	kill(pid, SIGUSR1);
}

void WAIT_CHILD() {
	while (sigflag == 0) 
		sigsuspend(&zeromask);
	sigflag = 0;

	if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) {

	}
}

int main() {
	TELL_WAIT();
	WAIT_CHILD();
	return 0;
}